/*****************************************************************************
 * A NOTER: Les classes Fait, Regle et KB sont toutes controlees de facon    *
 *          statique, c'est-a-dire que le constructeur est prive et cache    *
 *          par une methode statique qui gere une liste interne a la classe. *
 *                                                                           *
 *****************************************************************************/


/* Importations */
package ChainArriere;
import java.io.*;			// Pour lire les fichiers
import java.util.*;			// Pour les Vector


/* La base de donnees.
   Contient la liste des faits et la liste des regles. */

class KB 
{

	/* Partie dynamique pour gerer l'unicite et la creation */
	static private KB kb;		// La seule kb qui sera en fonction
	
	/* Partie dynamique */
	private Vector faits;		// La liste des faits ...
	private Vector regles;		// La liste des regles d'inferences connues
	private Vector questions;	// La liste des questions pertientes

	// Pour creer la KB la premiere fois
	static public KB get() 
	{
		if (kb == null) kb = new KB();
		return kb;
	}

	// Lire un ensemble de regles depuis un fichier
	static public KB lire(String fichier) 
	{

		// Initialisation a vide
		KB kb = KB.get();
		String ligne;

		// Lecture du fichier (protegee)
		try {
			BufferedReader entree = new BufferedReader(new FileReader (fichier));
			ligne = entree.readLine();
			while (ligne != null) {
				
				// On nettoi un peu
				ligne = ligne.trim();	
		
				// Pour chaque ligne utile du fichier
				if (ligne.compareTo("") != 0)
				{
					// On ajoute la regle
					kb.addRegle(ligne.trim());							
				}				
				// Ligne suivante
				ligne = entree.readLine();

			}
			entree.close();

		} catch (Exception e) {
			System.out.println("Incapable de lire le fichier " + fichier + e+"\n");
		}

		return kb;
	}

	// Le constructeur	[ prive!!! - Utiliser KB.get() ]
	private KB() 
	{
		faits = Fait.getListe();	// Les items sont gardes dans les classes
		regles = Regle.getListe();	// ... mais lies ici pour le cote pratique.
		questions = new Vector();
	}

	// Pour ajouter des regles
	public void addRegle(String texte) 
	{
		Regle regle = new Regle(texte);		
		regles.add(regle);
	}

	// Pour ajouter des questions (faits sur lesquels on peut interroger)
	public void addQuestions(String texte) 
	{
		String liste[] = texte.split(" ");

		// On creer les faits et on les ajoute a la liste des questions
		for (int i = 0; i < liste.length; i++)
		{
			questions.add(Fait.creer(liste[i].trim()));
		}
	}

	// Pour obtenir la liste des questions
	public Vector ask()
	{
		return questions;
	}

	// Pour obtenir la liste des regles
	public Vector rules()
	{
		return regles;
	}

}




